

#include "user_macro.h"
#include "offline_param.h"
#include "flash_access.h"
#include "signal_handle.h"

STR_OFF_PARAM  AppParamHdl;
STR_OFF_PARAM  AppParamCache;


uint16_t cLrobot_param_default[NUM_OFFLINE_PARAM] = 
{
	 /* 地址(10)地址(16)       初始值              单位    比例    偏移  描述              */
	 /*        0  0x0000*/       1234,        /*    -       1       0    参数区密码位      */
	 /*        1  0x0001*/       1234,        /*    -       1       0    参数区密码位      */
	 /*        2  0x0002*/          0,        /*    -       1       0    设备类型          */
	 /*        3  0x0003*/         99,        /*    -       1       0    设备编号          */
	 /*        4  0x0004*/        103,        /*    -       1       0    参数版本号        */
	 /*        5  0x0005*/          0,        /*    -       1       0    保留              */
	 /*        6  0x0006*/          0,        /*    -       1       0    保留              */
	 /*        7  0x0007*/          0,        /*    -       1       0    保留              */
	 /*        8  0x0008*/          0,        /*    -       1       0    保留              */
	 /*        9  0x0009*/          0,        /*    -       1       0    保留              */
	 /*       10  0x000A*/          0,        /*    -       1       0    保留              */
	 /*       11  0x000B*/          0,        /*    -       1       0    保留              */
	 /*       12  0x000C*/          0,        /*    -       1       0    保留              */
	 /*       13  0x000D*/          0,        /*    -       1       0    保留              */
	 /*       14  0x000E*/          0,        /*    -       1       0    保留              */
	 /*       15  0x000F*/          0,        /*    -       1       0    保留              */
	 /*       16  0x0010*/          0,        /*    -       1       0    保留              */
	 /*       17  0x0011*/          0,        /*    -       1       0    保留              */
	 /*       18  0x0012*/        500,        /*    ms      1       0    主板通讯超时阈值  */
	 /*       19  0x0013*/          0,        /*    -       1       0    主板通讯指令延续  */
	 /*       20  0x0014*/       3000,        /*    ms      1       0    电池通讯超时阈值  */
	 /*       21  0x0015*/       3000,        /*    ms      1       0    清洁通讯超时阈值  */
	 /*       22  0x0016*/         32,        /*    V       1       0    母线过压故障阈值  */
	 /*       23  0x0017*/         30,        /*    V       1       0    母线过压预警阈值  */
	 /*       24  0x0018*/        300,        /*    ms      1       0    母线过压检测时间  */
	 /*       25  0x0019*/         21,        /*    V       1       0    母线欠压故障阈值  */
	 /*       26  0x001A*/         23,        /*    V       1       0    母线欠压预警阈值  */
	 /*       27  0x001B*/        300,        /*    ms      1       0    母线欠压检测时间  */
	 /*       28  0x001C*/         50,        /*    A       1       0    母线过流故障阈值  */
	 /*       29  0x001D*/         30,        /*    A       1       0    母线过流预警阈值  */
	 /*       30  0x001E*/        300,        /*    ms      1       0    母线过流检测时间  */
	 /*       31  0x001F*/         80,        /*    °C      1       0    温度X1过温故障阈值*/
	 /*       32  0x0020*/         75,        /*    °C      1       0    温度X1过温预警阈值*/
	 /*       33  0x0021*/       3000,        /*    ms      1       0    温度X1过温检测时间*/
	 /*       34  0x0022*/         60,        /*    °C      1       0    温度X2温故障阈值  */
	 /*       35  0x0023*/         55,        /*    °C      1       0    温度X2过温预警阈值*/
	 /*       36  0x0024*/       3000,        /*    ms      1       0    温度X2过温检测时间*/
	 /*       37  0x0025*/          0,        /*    A       1       0    清洁过流故障阈值  */
	 /*       38  0x0026*/          0,        /*    A       1       0    清洁过流预警阈值  */
	 /*       39  0x0027*/          0,        /*    ms      1       0    清洁过流检测时间  */
	 /*       40  0x0028*/          0,        /*    A       1       0    行走过流故障阈值  */
	 /*       41  0x0029*/          0,        /*    A       1       0    行走过流预警阈值  */
	 /*       42  0x002A*/          0,        /*    ms      1       0    行走过流检测时间  */
	 /*       43  0x002B*/       0,        /*    mm      1       0    跌落X1阈值        */
	 /*       44  0x002C*/       0,        /*    mm      1       0    跌落X2阈值        */
	 /*       45  0x002D*/       0,        /*    mm      1       0    跌落X3阈值        */
	 /*       46  0x002E*/       0,        /*    mm      1       0    跌落X4阈值        */
	 /*       47  0x002F*/       0,        /*    mm      1       0    跌落X5阈值        */
	 /*       48  0x0030*/       2000,        /*    mm      1       0    跌落X6阈值        */
	 /*       49  0x0031*/          0,        /*    -       1       0    保留              */
	 /*       50  0x0032*/          0,        /*    -       1       0    保留              */
	 /*       51  0x0033*/          0,        /*    -       1       0    保留              */
	 /*       52  0x0034*/          0,        /*    -       1       0    保留              */
	 /*       53  0x0035*/          0,        /*    -       1       0    保留              */
	 /*       54  0x0036*/          0,        /*    -       1       0    保留              */
	 /*       55  0x0037*/          0,        /*    -       1       0    保留              */
	 /*       56  0x0038*/          0,        /*    -       1       0    保留              */
	 /*       57  0x0039*/          0,        /*    -       1       0    保留              */
	 /*       58  0x003A*/          0,        /*    -       1       0    保留              */
	 /*       59  0x003B*/          0,        /*    -       1       0    保留              */
};





uint16_t sErobot_param_default[NUM_OFFLINE_PARAM] = 
{
	 /* 地址(10)地址(16)       初始值              单位    比例    偏移  描述              */
	 /*        0  0x0000*/       1234,        /*    -       1       0    参数区密码位      */
	 /*        1  0x0001*/       1234,        /*    -       1       0    参数区密码位      */
	 /*        2  0x0002*/          2,        /*    -       1       0    设备类型          */
	 /*        3  0x0003*/         99,        /*    -       1       0    设备编号          */
	 /*        4  0x0004*/        103,        /*    -       1       0    参数版本号        */
	 /*        5  0x0005*/          0,        /*    -       1       0    保留              */
	 /*        6  0x0006*/          0,        /*    -       1       0    保留              */
	 /*        7  0x0007*/          0,        /*    -       1       0    保留              */
	 /*        8  0x0008*/          0,        /*    -       1       0    保留              */
	 /*        9  0x0009*/          0,        /*    -       1       0    保留              */
	 /*       10  0x000A*/          0,        /*    -       1       0    保留              */
	 /*       11  0x000B*/          0,        /*    -       1       0    保留              */
	 /*       12  0x000C*/          0,        /*    -       1       0    保留              */
	 /*       13  0x000D*/          0,        /*    -       1       0    保留              */
	 /*       14  0x000E*/          0,        /*    -       1       0    保留              */
	 /*       15  0x000F*/          0,        /*    -       1       0    保留              */
	 /*       16  0x0010*/          0,        /*    -       1       0    保留              */
	 /*       17  0x0011*/          0,        /*    -       1       0    保留              */
	 /*       18  0x0012*/        500,        /*    ms      1       0    主板通讯超时阈值  */
	 /*       19  0x0013*/          0,        /*    -       1       0    主板通讯指令延续  */
	 /*       20  0x0014*/       3000,        /*    ms      1       0    电池通讯超时阈值  */
	 /*       21  0x0015*/       3000,        /*    ms      1       0    清洁通讯超时阈值  */
	 /*       22  0x0016*/         21,        /*    V       1       0    母线过压故障阈值  */
	 /*       23  0x0017*/         18,        /*    V       1       0    母线过压预警阈值  */
	 /*       24  0x0018*/        300,        /*    ms      1       0    母线过压检测时间  */
	 /*       25  0x0019*/         12,        /*    V       1       0    母线欠压故障阈值  */
	 /*       26  0x001A*/         13,        /*    V       1       0    母线欠压预警阈值  */
	 /*       27  0x001B*/        300,        /*    ms      1       0    母线欠压检测时间  */
	 /*       28  0x001C*/         20,        /*    A       1       0    母线过流故障阈值  */
	 /*       29  0x001D*/         15,        /*    A       1       0    母线过流预警阈值  */
	 /*       30  0x001E*/        100,        /*    ms      1       0    母线过流检测时间  */
	 /*       31  0x001F*/         80,        /*    °C      1       0    温度X1过温故障阈值*/
	 /*       32  0x0020*/         75,        /*    °C      1       0    温度X1过温预警阈值*/
	 /*       33  0x0021*/       3000,        /*    ms      1       0    温度X1过温检测时间*/
	 /*       34  0x0022*/         60,        /*    °C      1       0    温度X2温故障阈值  */
	 /*       35  0x0023*/         55,        /*    °C      1       0    温度X2过温预警阈值*/
	 /*       36  0x0024*/       3000,        /*    ms      1       0    温度X2过温检测时间*/
	 /*       37  0x0025*/          0,        /*    A       1       0    清洁过流故障阈值  */
	 /*       38  0x0026*/          0,        /*    A       1       0    清洁过流预警阈值  */
	 /*       39  0x0027*/          0,        /*    ms      1       0    清洁过流检测时间  */
	 /*       40  0x0028*/          0,        /*    A       1       0    行走过流故障阈值  */
	 /*       41  0x0029*/          0,        /*    A       1       0    行走过流预警阈值  */
	 /*       42  0x002A*/          0,        /*    ms      1       0    行走过流检测时间  */
	 /*       43  0x002B*/       0,        /*    mm      1       0    跌落X1阈值        */
	 /*       44  0x002C*/       0,        /*    mm      1       0    跌落X2阈值        */
	 /*       45  0x002D*/       0,        /*    mm      1       0    跌落X3阈值        */
	 /*       46  0x002E*/       0,        /*    mm      1       0    跌落X4阈值        */
	 /*       47  0x002F*/       0,        /*    mm      1       0    跌落X5阈值        */
	 /*       48  0x0030*/       2000,        /*    mm      1       0    跌落X6阈值        */
	 /*       49  0x0031*/          0,        /*    -       1       0    保留              */
	 /*       50  0x0032*/          0,        /*    -       1       0    保留              */
	 /*       51  0x0033*/          0,        /*    -       1       0    保留              */
	 /*       52  0x0034*/          0,        /*    -       1       0    保留              */
	 /*       53  0x0035*/          0,        /*    -       1       0    保留              */
	 /*       54  0x0036*/          0,        /*    -       1       0    保留              */
	 /*       55  0x0037*/          0,        /*    -       1       0    保留              */
	 /*       56  0x0038*/          0,        /*    -       1       0    保留              */
	 /*       57  0x0039*/          0,        /*    -       1       0    保留              */
	 /*       58  0x003A*/          0,        /*    -       1       0    保留              */
	 /*       59  0x003B*/          0,        /*    -       1       0    保留              */
};





/*!
    \brief      
    \param[in]  none
    \param[out] none
    \retval     none
*/

void flash_param_init(void)
{
	
	uint16_t password_L = 0;
	uint16_t password_H = 0;
	uint16_t param_ves_num = 0;
	uint16_t device_type = 0;
	
	STR_OFF_PARAM *param_temp;

	password_L = *((uint16_t *)(PASSWORD_ADDR));
	password_H = *((uint16_t *)(PASSWORD_ADDR + 2));
	
	device_type = *((uint16_t *)PARAM_DEVICE_TYPE_ADDR);
	
	param_ves_num = *((uint16_t *)PARAM_VER_NUM_ADDR);		
	
	
	if(device_type == ENUM_CLEAN_ROBOT)
	{
		param_temp = (STR_OFF_PARAM *)cLrobot_param_default;		
	}
	else
	{
		param_temp = (STR_OFF_PARAM *)sErobot_param_default;		
	}
	
	
	if((password_L != PASSWORD_DEFAULT) || (password_H != PASSWORD_DEFAULT))
	{
		flash_data_erase(PARAM_APP_START_ADDR, 1);
		
		flash_data_write(PARAM_APP_START_ADDR, (uint16_t *)&param_temp->data[0], NUM_OFFLINE_PARAM);
	}
	
	else if(param_ves_num != param_temp->verNum_param)
	{
		uint16_t device_type;
		uint16_t device_num;
		
		device_type = *((uint16_t *)PARAM_DEVICE_TYPE_ADDR);
		device_num  = *((uint16_t *)PARAM_DEVICE_NUM_ADDR);
		
		flash_data_erase(PARAM_APP_START_ADDR, 1);
		
		param_temp->device_type = device_type;
		param_temp->device_num  = device_num;
		
		flash_data_write(PARAM_APP_START_ADDR, (uint16_t *)&param_temp->data[0], NUM_OFFLINE_PARAM);
	}
	
	flash_data_read(PARAM_APP_START_ADDR, &AppParamHdl.data[0], NUM_OFFLINE_PARAM);
	
	for(uint8_t i=0; i<NUM_OFFLINE_PARAM; i++)
	{
		AppParamCache.data[i] = AppParamHdl.data[i];
	}
}




/*!
    \brief      
    \param[in]  none
    \param[out] none
    \retval     none
*/

uint8_t flash_param_cache_write(uint16_t addr, uint16_t data)
{
	uint8_t write_res = 0;
	
	if(addr < NUM_OFFLINE_PARAM)
	{
		AppParamCache.data[addr] = data;
		
		write_res = 1;
	}
		
	return write_res;
}



/*!
    \brief      
    \param[in]  none
    \param[out] none
    \retval     none
*/

uint8_t flash_param_saveALL(void)
{
	uint8_t save_res = 0;
	
	flash_data_erase(PARAM_APP_START_ADDR, 2);
	flash_data_write(PARAM_APP_START_ADDR, (uint16_t *)&AppParamCache.data[0], NUM_OFFLINE_PARAM);
	
	flash_data_read(PARAM_APP_START_ADDR, &AppParamHdl.data[0], NUM_OFFLINE_PARAM);
	
	save_res = 1;
	
	return save_res;
}







